package com.lekang.system.task;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.lekang.system.mapper.TaskArrangementMapper;
import com.lekang.system.utils.TaskGenerationUtils;
import com.lekang.system.domain.TaskArrangement;

/**
 * 任务生成定时调度器
 * 根据图片中的业务规则实现定时任务生成
 * 
 * @author zhihao
 * @date 2025-01-15
 */

@Component
//@Component
public class TaskGenerationScheduler {

    @Autowired
    private TaskArrangementMapper taskArrangementMapper;

    /**
     * 每月1号00:00:00生成护理计划内任务
     * 根据图片说明：非首月：每个月1号00:00:00生成任务
     * 测试用：每5分钟执行一次
     * 
     * 【已禁用】此定时器已被 TaskSchedulerServiceImpl 替代
     */
    // @Scheduled(cron = "0 */30 * * * ?")  // 已禁用 - 改用 TaskSchedulerServiceImpl.generateMonthlyTasks()
    public void generateMonthlyNursingPlanTasks() {
        System.out.println("开始执行每月护理计划内任务生成 - " + new Date());
        
        try {
            // 查询所有需要生成任务的护理计划
            Map<String, Object> params = new HashMap<>();
            params.put("projectType", "护理计划内");
            params.put("status", "启用");
            
            // 这里需要根据实际的护理计划表结构来查询
            // List<Map<String, Object>> nursingPlans = nursingPlanMapper.selectActiveNursingPlans(params);
            
            // 示例：为每个护理计划生成任务
            // for (Map<String, Object> plan : nursingPlans) {
            //     Long elderlyId = Long.valueOf(plan.get("elderlyId").toString());
            //     Long nursingItemId = Long.valueOf(plan.get("nursingItemId").toString());
            //     String executionCycleType = plan.get("executionCycleType").toString();
            //     Integer executionFrequency = Integer.valueOf(plan.get("executionFrequency").toString());
            //     Date plannedStartTime = (Date) plan.get("plannedStartTime");
            //     
            //     List<TaskArrangement> tasks = TaskGenerationUtils.generateNursingPlanTasks(
            //         elderlyId, nursingItemId, executionCycleType, executionFrequency, plannedStartTime);
            //     
            //     // 批量插入任务
            //     for (TaskArrangement task : tasks) {
            //         taskArrangementMapper.insertTaskArrangement(task);
            //     }
            // }
            
            System.out.println("每月护理计划内任务生成完成");
        } catch (Exception e) {
            System.err.println("每月护理计划内任务生成失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 每日00:00时刷新所有未执行的任务
     * 根据图片说明：每日00:00时，刷新所有未执行的任务，若该老人已退住成功，则不再显示该老人待执行的任务
     * 测试用：每2分钟执行一次
     * 
     * 【已禁用】此定时器已被 TaskSchedulerServiceImpl 替代
     */
    // @Scheduled(cron = "0 */31 * * * ?")  // 已禁用 - 改用 TaskSchedulerServiceImpl.refreshDailyTasks()
    public void refreshUnfinishedTasks() {
        System.out.println("开始执行每日任务刷新 - " + new Date());
        
        try {
            // 查询所有未执行的任务
            Map<String, Object> params = new HashMap<>();
            params.put("status", "待执行");
            
            List<Map<String, Object>> unfinishedTasks = taskArrangementMapper.selectTaskArrangementByStatus(params);
            
            for (Map<String, Object> task : unfinishedTasks) {
                Object elderlyIdObj = task.get("elderly_id");
                if (elderlyIdObj == null) {
                    System.out.println("警告：任务 " + task.get("id") + " 缺少elderly_id字段");
                    continue;
                }
                Long elderlyId = Long.valueOf(elderlyIdObj.toString());
                
                // 检查老人是否已退住成功
                // 这里需要根据实际的入住管理表来查询老人状态
                // boolean isCheckedOut = checkInManagementMapper.isElderlyCheckedOut(elderlyId);
                
                // if (isCheckedOut) {
                //     // 如果老人已退住，则隐藏该任务（可以通过更新状态或删除来实现）
                //     Map<String, Object> updateParams = new HashMap<>();
                //     updateParams.put("id", task.get("id"));
                //     updateParams.put("status", "已退住");
                //     taskArrangementMapper.updateTaskStatus(updateParams);
                // }
            }
            
            System.out.println("每日任务刷新完成");
        } catch (Exception e) {
            System.err.println("每日任务刷新失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 生成护理计划内任务（入住首月）
     * 根据图片说明：入住首月：当入住完成后，生成首月账单后生成护理任务
     * 这个方法需要在入住完成和首月账单生成后手动调用
     * 
     * @param elderlyId 老人ID
     * @param nursingItemId 护理项目ID
     * @param executionCycleType 执行周期类型
     * @param executionFrequency 执行频次
     * @param plannedStartTime 计划执行开始时间
     */
    public void generateFirstMonthNursingPlanTasks(Long elderlyId, Long nursingItemId, 
                                                  String executionCycleType, Integer executionFrequency, 
                                                  Date plannedStartTime) {
        System.out.println("开始生成入住首月护理计划内任务 - 老人ID: " + elderlyId + " - " + new Date());
        
        try {
            List<TaskArrangement> tasks = TaskGenerationUtils.generateNursingPlanTasks(
                elderlyId, nursingItemId, executionCycleType, executionFrequency, plannedStartTime);
            
            // 批量插入任务
            for (TaskArrangement task : tasks) {
                taskArrangementMapper.insertTaskArrangement(task);
            }
            
            System.out.println("入住首月护理计划内任务生成完成，共生成 " + tasks.size() + " 个任务");
        } catch (Exception e) {
            System.err.println("入住首月护理计划内任务生成失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 生成护理计划外任务
     * 根据图片说明：用户端下单且支付成功的订单生成的任务
     * 这个方法需要在订单支付成功后调用
     * 
     * @param elderlyId 老人ID
     * @param nursingItemId 护理项目ID
     * @param expectedServiceTime 期望服务时间
     * @param creator 创建人（下单用户昵称）
     * @param creatorId 创建人ID
     * @param orderNo 订单号
     */
    public void generateNonNursingPlanTask(Long elderlyId, Long nursingItemId, 
                                         Date expectedServiceTime, String creator, 
                                         Long creatorId, String orderNo) {
        System.out.println("开始生成护理计划外任务 - 老人ID: " + elderlyId + " 订单号: " + orderNo + " - " + new Date());
        
        try {
            TaskArrangement task = TaskGenerationUtils.generateNonNursingPlanTask(
                elderlyId, nursingItemId, expectedServiceTime, creator, creatorId, orderNo);
            
            taskArrangementMapper.insertTaskArrangement(task);
            
            System.out.println("护理计划外任务生成完成");
        } catch (Exception e) {
            System.err.println("护理计划外任务生成失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
